package br.com.tarcilahelpdesk.managedBeans;

import br.com.tarcilahelpdesk.enums.EnumObjetosPersistentes;
import br.com.tarcilahelpdesk.enums.EnumTipoAtributo;
import br.com.tarcilahelpdesk.modelo.Modelo;
import br.com.tarcilahelpdesk.persistencia.AtributoValor;
import br.com.tarcilahelpdesk.persistencia.Solicitante;
import br.com.tarcilahelpdesk.util.HibernateUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.hibernate.Session;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.model.LazyDataModel;

/**
 * MB do cadastro de Solicitantes.
 * @author vinicius
 */
@ManagedBean(name = "solicitante")
@ViewScoped
public class SolicitanteBean implements Serializable
{

    private Session ss;
    private LazyDataModel<Solicitante> tabela;
    private Collection<AtributoValor> tabelaAtributos;
    private String nome;
    private Solicitante solicitanteSelecionado;    
    private EnumTipoAtributo tipoTexto = EnumTipoAtributo.Texto;
    private EnumTipoAtributo tipoTextoLongo = EnumTipoAtributo.TextoLongo;
    private EnumTipoAtributo tipoCaracter = EnumTipoAtributo.Caracter;
    private EnumTipoAtributo tipoNumero = EnumTipoAtributo.Numero;
    private EnumTipoAtributo tipoBooleano = EnumTipoAtributo.Booleano;
    private EnumTipoAtributo tipoData = EnumTipoAtributo.Data;
    
    public SolicitanteBean()
    {
        ss = HibernateUtil.getSessionFactory().openSession();
    }

    @PostConstruct
    public void inicializar()
    {
        tabela = Modelo.getInstancia().gerarLazyModelObjetoPersistente(EnumObjetosPersistentes.Solicitante, ss);
        tabelaAtributos = new ArrayList<AtributoValor>();
        carregarTabelaAtributos();
    }

    /**
     * Encerra a sessão do hibernate na destruicao do bean.
     */
    @PreDestroy
    public void encerrar()
    {
        ss.close();
    }

    /**
     * Limpa o nome solicitante.
     */
    public void limparBean()
    {
        setNome("");
    }

    /**
     * Preenche as tabelas de atributos extras com os atributos cadastrados na customização.
     */
    public void carregarTabelaAtributos()
    {
        Collection<AtributoValor> atributosSolicitante = Modelo.getInstancia().getListaAtributos(EnumObjetosPersistentes.Solicitante, ss);
        tabelaAtributos.clear();

        for (AtributoValor att : atributosSolicitante)
        {
            AtributoValor atributo = new AtributoValor();
            atributo.setNomeAtributo(att.getNomeAtributo());
            atributo.setTipo(att.getTipo());
            tabelaAtributos.add(atributo);
        }
    }

    /**
     * Seta os valores dos atributos extras  no solicitante informado.
     * @param solicitante 
     */
    public void atualizarAtributos(Solicitante solicitante)
    {
        try
        {
                for (AtributoValor att : tabelaAtributos)
            {
                solicitante.getAtributosSolicitante().add(att);
                att.setSolicitante(solicitante);
                //Modelo.getInstancia().adicionar(att, ss);
            }

            carregarTabelaAtributos();

        }
        catch (Exception e)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "Erro ao adicionar atributos: " + e.getMessage(), ""));
        }

    }

    /**
     * Adiciona um novo solicitante com o nome informado na view.
     */
    public void adicionarSolicitante()
    {
        try
        {
            Solicitante solicitante = new Solicitante();
            solicitante.setNome(getNome());           

            atualizarAtributos(solicitante);
            
            Modelo.getInstancia().adicionar(solicitante, ss);            

            limparBean();

            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Solicitante [" + solicitante.getNome() + "] adicionado com sucesso!", ""));

        }
        catch (ConstraintViolationException e)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Este solicitante já está cadastrado!", ""));
            limparBean();
            ss.close();
            ss = HibernateUtil.getSessionFactory().openSession();
        }

    }

    /**
     * Método para atualizar os atributos do solicitante já cadastrado.
     * @param atributo 
     */
    public void atualizarAtributo(AtributoValor atributo)
    {
        try
        {
            Modelo.getInstancia().adicionar(atributo, ss);

            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Atributo [" + atributo.getNomeAtributo() + "] atualizado com sucesso!", ""));
        }
        catch (Exception e)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "Erro ao atualizar: " + e.getMessage(), ""));
        }
    }

    /**
     * Remove um solicitante selecionado na tabela da view.
     */
    public void removerSolicitante()
    {
        try
        {
            if (solicitanteSelecionado == null)
            {
                FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_WARN,
                        "Selecione algum item antes de remover!", ""));
            }
            else
            {
                Modelo.getInstancia().remover(solicitanteSelecionado, ss);

                FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Solicitante [" + solicitanteSelecionado.getNome() + "] removido com sucesso!", ""));

            }
        }
        catch (Exception e)
        {
            FacesContext.getCurrentInstance().addMessage("Mensagem", new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "Erro ao remover: " + e.getMessage(), ""));
        }

    }

    //Getters and Setters
    public String getNome()
    {
        return nome;
    }

    public void setNome(String nome)
    {
        this.nome = nome;
    }

    public Solicitante getSolicitanteSelecionado()
    {
        return solicitanteSelecionado;
    }

    public void setSolicitanteSelecionado(Solicitante solicitanteSelecionado)
    {
        this.solicitanteSelecionado = solicitanteSelecionado;
    }

    public LazyDataModel<Solicitante> getTabela()
    {
        return tabela;
    }

    public void setTabela(LazyDataModel<Solicitante> tabela)
    {
        this.tabela = tabela;
    }

    public Collection<AtributoValor> getTabelaAtributos()
    {
        return tabelaAtributos;
    }

    public void setTabelaAtributos(Collection<AtributoValor> tabelaAtributos)
    {
        this.tabelaAtributos = tabelaAtributos;
    }

    

    public EnumTipoAtributo getTipoTexto()
    {
        return tipoTexto;
    }
    
    public EnumTipoAtributo getTipoData()
    {
        return tipoData;
    }

    public EnumTipoAtributo getTipoBooleano()
    {
        return tipoBooleano;
    }

    public EnumTipoAtributo getTipoCaracter()
    {
        return tipoCaracter;
    }

    public EnumTipoAtributo getTipoNumero()
    {
        return tipoNumero;
    }

    public EnumTipoAtributo getTipoTextoLongo()
    {
        return tipoTextoLongo;
    }
    
    
    
}
